package cn.edu.cdu.health.controller;

import cn.edu.cdu.health.common.BizException;
import cn.edu.cdu.health.common.R;
import cn.edu.cdu.health.entity.PageDto;
import cn.edu.cdu.health.entity.PageResult;
import cn.edu.cdu.health.entity.User;
import cn.edu.cdu.health.service.UserService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 定义一个和用户模块相关的控制器
 * @Controller: 表示当前类是一个控制器类型，会自动被SpringBoot扫描到并管理
 * 管理： UserController userController = new UserController();
 * 通过BeanFactory把userController对象添加到bean的容器中（Spring）
 *
 * 完整访问： http://localhost:8080/user/getById
 * @RequestMapping: 定义该控制器被访问的方式
 *
 * @RestController: 聚合注解，聚合了如下两个注解的功能
 * @Controller
 * @ResponseBody
 *
 * @Autowired: 自动装配，依赖注入，
 */

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 声明了一个getById的接口
   // @RequestMapping(value = "/getById", method = RequestMethod.GET)
   // @GetMapping(value = "/getById")  value是默认属性，当只有value存在时可以省略

    // 指定参数 http://localhost:8080/user/getById?id=1
    // 设定参数的方式： @RequestParam("id")
    // 当前端的参数和方法的参数名称一致，可以省略

    // @ResponseBody: 把当前方法的返回信息组装成json格式
    // 按此逻辑，每一个方法都需要添加，于是，该注解应该声明在类上（表示每个类中的方法都具备）

    // ajax(axios)
    // 把对象作为返回值，对象会先通过序列化转换为json字符串，返回给前端
    @GetMapping( "/getById")
    public R getById(Integer id) throws BizException {

        User byId = userService.getById(id);
        return R.ok(byId);
    }

    // 接收多个参数的方法 http://localhost:8080/user/login?phone=13512345678&password=123456
    // 方法声明多个对应的参数即可
    @GetMapping( "/login")
    public R login(String phone,String password){
        return R.ok();
    }

    /**
     * 多个参数的情况：用户注册需要提供姓名、手机号、邮箱、用户密码...
     * 声明一个类User，把用户信息作为该类的成员字段
     *
     * @PostMapping： 要求前端发送请求的方式用POST
     * @RequestBody: 要求前端发送（application/json)：json字符串
     */
    @PostMapping( "/register")
    public R register(@RequestBody User user){
        user.setId(1001);
        return R.ok(user);
    }

    @PostMapping("/selectByPage")
    public R selectByPage(@RequestBody PageDto pageDto){

        IPage<User> page = new Page<>(pageDto.getCurrent(),pageDto.getSize());
        userService.page(page);
        // 获取数据
        List<User> records = page.getRecords();

        // 总记录数
        long total = page.getTotal();

        // 封装
        PageResult pageResult = new PageResult();
        pageResult.setRecords(records);
        pageResult.setTotal(total);

        return R.ok(pageResult);
    }



}
